from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
from Tkinter import *
import random
import pickle
from batiment2 import *
from Etoile import *
from Planete import *
from unite import *
from univers import *
from Joueur import *
from modeleClient import *


class Serveur(object):
    def __init__(self):
        self.partieEnCours=0
        self.listeJoueurs={}
        self.bin={}
    
    ##le modele envoie au serveur l'univers nouvellement cree
    def creerUnivers(self,univers):
        self.modele=Modele(self)
        self.modele.univers=pickle.loads(univers)
        self.partieEnCours=1
        return "ok"
    
    ##confirme si oui ou non une partie est en cours
    def demanderSiPartie(self):
        if self.partieEnCours==1:
            return "oui"
        else:
            return "non"
    
    ##cree le nouveau joueur, amenage une etoile et retourne l'univers
    def joindrePartie(self,nick):
        etoileDepart=0
        ##trouver une etoile libre
        while self.modele.univers.tabEtoiles[etoileDepart].proprietaire<>"":
            etoileDepart+=1
        ##amenager l'etoile
        self.modele.univers.tabEtoiles[etoileDepart].proprietaire = nick
        stationSpatiale=Structure('stationSpatiale',self.modele.univers.tabEtoiles[etoileDepart])
        self.modele.univers.tabEtoiles[etoileDepart].tabStructures.append(stationSpatiale)
        ##creer le scout de depart
        indexUnite=len(self.modele.univers.tabUnites)
        uniteDepart=Unite('scout', stationSpatiale)
        self.modele.univers.tabUnites.append(uniteDepart)
        ##creer le joueur
        self.listeJoueurs[nick]=Joueur(nick, etoileDepart, indexUnite)
        ##creer la bin du joueur
        self.bin[nick]=[]
        
        for i in self.bin:
            if i <> nick:
                self.bin[i].append(["nouveauJoueur",nick,self.modele.univers.tabEtoiles[etoileDepart],uniteDepart])
        
        return pickle.dumps(self.modele.univers)
    
    ##retourne le joueur nouvellement cree    
    def getJoueur(self, nick):
        return pickle.dumps(self.listeJoueurs[nick])
    
    
    ##ajoute a toutes les bins le nouveau mouvement
    def initMouvement(self,indexUnite,x,y,z):
        print "serveur:"
        print indexUnite,x,y,z
        self.modele.initMouvement(indexUnite,x,y,z)
        for i in self.bin:
            if i <> self.modele.univers.tabUnites[indexUnite].proprietaire:
                self.bin[i].append(["mvt",indexUnite,x,y,z])
        return "ok"
    
    ##retourner la liste des changements
    def ping(self,nom):
        binTemp=self.bin[nom]
        self.bin[nom]=[]
        if binTemp == []:
            return "rien"
        else:
            return pickle.dumps(binTemp)
        
    def afficher(self):
        pass
    def effacer(self):
        pass


server = SimpleXMLRPCServer(("localhost", 8000),
                    requestHandler=SimpleXMLRPCRequestHandler)
server.register_introspection_functions()
server.register_instance(Serveur())
print "serveur initialise"
server.serve_forever()